package belleza.relativa

import grails.plugins.rest.client.RestBuilder
import org.codehaus.groovy.grails.web.json.JSONObject

class RedNeuronalOriginalService {

    Random rand = new Random()

    def rest = new RestBuilder()

    def url1 = "http://localhost:8080"

    def url2 = "http://localhost:7070"

    /**
     *
     * @param usuarioId
     * El id de usuario que va a guardar en la red neuronal
     * Se recomienda usar el mismo que en la base de datos
     * Usar 20.000 para el usuario invitado
     * @param generoId
     * 0 si es hombre
     * 1 si es mujer
     * @param interesadoEn
     * 0 busca hombres
     * 1 busca mujeres
     * 2 ambos
     * @param fotoPrincipal
     * La foto principal del usuario
     */
    def createPersona(def usuarioId, def generoId, def interesadoEn, Foto fotoPrincipal) {
        if (fotoPrincipal == null) {
            fotoPrincipal = new Foto()
            fotoPrincipal.foto = new File('web-app/images/imagenPersona/invitado.jpg').bytes
        }
        def f = new File("web-app/images/imagenPersona/temporal.jpg")
        f.delete()
        def os = f.newOutputStream()
        os.write(fotoPrincipal.foto, 0, fotoPrincipal.foto.length)
        os.close()

        def resp = rest.post(url1+"/users") {
            contentType "multipart/form-data"
            userid = usuarioId.toString()
            genderid = generoId.toString()
            interestedin = interesadoEn.toString()
        }

        JSONObject respuesta = resp.json

        if (respuesta.get("success")) {
            def respFoto = rest.post(url1+"/users/images") {
                contentType "multipart/form-data"
                userid = usuarioId.toString()
                data = new File("web-app/images/imagenPersona/temporal.jpg")
            }
            JSONObject respuestaFoto = respFoto.json
            if (respuestaFoto.get("success")) {

                //Ahora lo creo para el otro webservice
                resp = rest.post(url2+"/users") {
                    contentType "multipart/form-data"
                    userid = usuarioId.toString()
                    genderid = generoId.toString()
                    interestedin = interesadoEn.toString()
                }
                respuesta = resp.json
                if (respuesta.get("success")) {
                    respFoto = rest.post(url2+"/users/images") {
                        contentType "multipart/form-data"
                        userid = usuarioId.toString()
                        data = new File("web-app/images/imagenPersona/temporal.jpg")
                    }
                    respuestaFoto = respFoto.json
                    if (respuestaFoto.get("success")) {
                        return true
                    } else {
                        return false
                    }
                }

            } else {
                return false
            }
        } else {
            return false
        }

    }

    /**
     *
     * @param usuarioId
     * @param generoId
     * 0 si es hombre
     * 1 si es mujer
     * @return
     */
    def setGeneroPersona(def usuarioId, def generoId) {
        def resp = rest.post(url1+"/users/gender") {
            contentType "multipart/form-data"
            userid = usuarioId.toString()
            genderid = generoId.toString()
        }

        JSONObject respuesta = resp.json

        if (respuesta.get("success")) {

            resp = rest.post(url2+"/users/gender") {
                contentType "multipart/form-data"
                userid = usuarioId.toString()
                genderid = generoId.toString()
            }
            respuesta = resp.json
            if (respuesta.get("success")) {
                return true
            } else {
                return false
            }
        } else {
            return false
        }
    }

    /**
     *
     * @param usuarioId
     * @param interesadoEn
     * 0 busca hombres
     * 1 busca mujeres
     * 2 ambos
     * @return
     */
    def setInteresPersona(def usuarioId, def interesadoEn) {
        def resp = rest.post(url1+"/users/gender") {
            contentType "multipart/form-data"
            userid = usuarioId.toString()
            interest = interesadoEn.toString
        }

        JSONObject respuesta = resp.json

        if (respuesta.get("success")) {

            resp = rest.post(url2+"/users/gender") {
                contentType "multipart/form-data"
                userid = usuarioId.toString()
                interest = interesadoEn.toString
            }

            respuesta = resp.json

            if (respuesta.get("success")) {
                return true
            } else {
                return false
            }


        } else {
            return false
        }
    }

    /**
     *
     * @param usuarioId
     * El id del usuario del cual se quiere borrar en la red neuronal
     * @return
     */
    def deletePersona(def usuarioId) {
        def resp = rest.delete(url1+"/users?userid="+usuarioId.toString())

        JSONObject respuesta = resp.json

        if (respuesta.get("success")) {

            resp = rest.delete(url2+"/users?userid="+usuarioId.toString())
            respuesta = resp.json
            if (respuesta.get("success")) {
                return true
            } else {
                return false
            }


        } else {
            return false
        }

        return true
    }

    /**
     * Devuelve al azar el numero de imagen con la que se va a entrenar (Esto depende del set de imagenes de entrenamiento)
     * @return
     */
    def getNumeroImagenEntrenamiento(int interesadoEn) {
        if (interesadoEn==1) {
            return rand.nextInt(139)+1
        } else if (interesadoEn==0) {
            return rand.nextInt(141)+140
        } else {
            return rand.nextInt(333)+1
        }

    }

    /**
     * Devuelve una variable del tipo Foto con la imagen para entrenar
     * El controlador con la instancia de la clase Foto tiene que hacer lo que hace el imageControler
     * response.contentType = foto?.fotoType
     * response.contentLength = foto?.foto?.length
     * response.outputStream.write(foto?.foto)
     *
     * Ahora devuelve solamente la imagen del usuario con id=1
     * @return
     */
    def getFotoParaEntrenar(def numeroImagenEntrenamiento) {
        def foto = new Foto()
        foto.foto = new File('web-app/images/training/imagen'+numeroImagenEntrenamiento.toString()+'.jpg').bytes
        foto.fotoType='image/jpeg'
        return foto
    }

    /**
     * @usuarioId
     * id del usuario logueado
     * @param numeroImagenEntrenamiento
     * El id de la imagen con la que se puntuó
     * @param puntaje
     * Puntaje del 1 al 10
     * @return
     */
    def entrenarRed(def usuarioId, def numeroImagenEntrenamiento, def puntaje) {
        def url = url1
        if (usuarioId==54) url = url2
        def resp = rest.put(url+"/users/training") {
            contentType "multipart/form-data"
            userid = usuarioId.toString()
            trainingid = "imagen"+numeroImagenEntrenamiento.toString()+".jpg"
            response = puntaje.toString()
        }

        JSONObject respuesta = resp.json

        if (respuesta.get("success")) {
            return true
        } else {
            return false
        }
    }

    /**
     *
     * @param usuarioId
     * id del usuario logueado
     * @param usuarioObjetivoId
     * id del usuario que se quiere saber si es aceptable en funcion de los gustos del usuario logueado
     */
    float getAceptableUsuario(def usuarioId, def usuarioObjetivoId) {
        def url = url1
        if (usuarioId==54) url = url2
        def resp = rest.get(url+'/likes?sourceid='+usuarioId.toString()+'&targetid='+usuarioObjetivoId.toString())

        JSONObject respuesta = resp.json
        if (respuesta.get("success")) {
            return respuesta.get("result").get("value")
        } else {
            return 0.0
        }
    }

    /**
     * Devuelve una lista con todos los usuarios que le podria gustar al usuario indicado con "usuarioId" (Puntaje mayor a 5)
     * @param usuarioId
     * id del usuario logueado
     * @param cantMaxima
     * cantidad maxima de resultados
     */
    def getUsuariosAceptables(def usuarioId, def cantMaxima) {

        def url = url1
        if (usuarioId==54) url = url2

        List<Integer> listaPersonaId = new ArrayList<Integer>();

        def resp = rest.get(url+'/likes/users?sourceid='+usuarioId.toString()+'&limit='+cantMaxima.toString())

        JSONObject respuesta = resp.json

        if (respuesta.get("success")) {
            List<JSONObject> personas = respuesta.get("result")
            for (persona in personas) {
                String personaId=persona.get("targetid")
                Integer numeroPersona = Integer.parseInt(personaId)
                if (numeroPersona != 20) {
                    listaPersonaId.add(Integer.parseInt(personaId))
                }
            }
        }

        return listaPersonaId
    }
}
